package com.etrans.web.gps.base.service;


import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

/**
 * <p>
 * 服务类基类，作为基础的数据操作
 * </p>
 * 
 * User: R.劳
 * Date: 2017/6/7
 * Time: 17:22
 * To change this template use File | Settings | File Templates.
 */
@Service
public class BaseService {

    /**
     * 主库mybatis session,SqlSession代理对象，线程安全
     */
    @Autowired
    protected SqlSessionTemplate masterSession;

    /**
     * 从库mybatis session,SqlSession代理对象，线程安全
     */
    @Autowired
    protected SqlSessionTemplate slaveSession;

    /**
     * <p>
     *   更新记录
     *   对于批量操作，也是调用该方法，一切批量操作均由mybatis在sql中完成
     *    mybatis会为此做批量处理
     * </p>
     *
     *<code>
     *     super.update(String statementName,Object param);
     *</code>
     *
     * @param statementName String
     * @param param Object
     * @return int 影响行数
     */
    protected int update(String statementName,Object param){
        return this.masterSession.update(statementName, param);
    }

    /**
     * <p>
     *     插入新的记录
     *     对于批量操作，也是调用该方法，一切批量操作均由mybatis在sql中完成
     *     mybatis会为此做批量处理
     * </p>
     * @param statementName String
     * @param param Object
     * @return  int 影响行数
     */
    protected int insert(String statementName,Object param){
        return this.masterSession.insert(statementName, param);
    }

    /**
     * <p>
     *     删除记录
     *     对于批量操作，也是调用该方法，一切批量操作均由mybatis在sql中完成
     *     mybatis会为此做批量处理
     * </p>
     * @param statementName String
     * @param param Object
     * @return  int 影响行数
     */
    protected int delete(String statementName,Object param){
        return this.masterSession.delete(statementName, param);
    }

    /**
     *<p>
     *     查询多条记录
     * </p>
     * @param statementName String
     * @param param Object
     * @return List<E>
     */
    protected <E> List<E> selectList(String statementName, Object param){
        return this.slaveSession.selectList(statementName,param);
    }

    /**
     * 查询单个对象 SQL语句必须查询只有一条或者limit 1来控制
     * 因为底层代码<code>
     *     List list = this.selectList(statement, parameter);
     if(list.size() == 1) {
     return list.get(0);
     * </code>
     * 只会根据语句全部查出再get(0)
     *
     * @param statementName mybatis的SqlId
     * @param param Object 查询参数
     * @return Object
     */
    protected <T> T selectOne(String statementName,Object param){
        return this.slaveSession.selectOne(statementName,param);
    }

}
